package com.study.jdk;

import com.study.service.UserService;
import com.study.service.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author chenyeqing
 * @Date 2021/10/11 20:53
 */
public class TestJDKProxy {
    /**
     * 1. 借用类加载器 TestJDKProxy
     *            userServiceImpl
     * 2. JDK8.0之前
     *          final UserServiceImpl userService = new UserServiceImpl();
     *
     * @param args
     */
    public static void main(String[] args) {
        // 1. 创建原始对象
        UserServiceImpl userService = new UserServiceImpl();

        // 2. JDK创建动态代理
        UserService userServiceProxy = (UserService) Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * 用于书写额外功能，额外功能 运行在原始方法执行之 前、后、前后、抛出异常
             * 重点是让 原始方法的运行
             * 从正常角度让一个方法运行。需要一个对象、方法、参数。而此时，只有方法和参数。没有对象（userService.login()）
             * @param proxy 忽略掉 代表代理对象
             * @param method 额外功能 所增加给的那个原始方法
             * @param args 原始方法的参数
             * @return Object 原始方法返回值
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("----proxy log----");
                Object invoke = method.invoke(userService, args);
                return invoke;

            }
        });
        userServiceProxy.login("zhangsan", "123456");
    }
}
